// 获取用户的收货地址
// 1.绑定点击事件
// 2 获取 用户 对小程序 所授予 获取地址的  权限 状态 scope
// 1 假设 用户 点击获取收货地址的提示框 确定  authSetting scope.address
// scope 值 true 直接调用 获取收货地址
// 2 假设 用户 从来没有调用过 收货地址的api
// scope undefined 直接调用 获取收货地址
// 3 假设 用户 点击获取收货地址的提示框 取消
// scope 值 false
// 1 诱导用户 自己 打开 授权设置页面(wx.openSetting) 当用户重新给与 获取地址权限的时候
// 2 获取收货地址
// 实现底部全选  如果缓存购物车数组中每条数据的checked=true 那么全选就被选中
// 5 总价格和总数量
//  1 需要所有商品被选中 底部才计算
//  2 获取购物车数组
//  3 遍历购物车数组 
//  4 判断商品是否被选中
//  5 总价格 += 商品单价 * 商品数量
//  6 总数量 += 商品数量 
//  7 把计算后的价格和数量 设置回data中即可

// 购物车中商品选中
// 1绑定change事件
// 2获取到被修改的商品对象
// 3商品对象的选中状态取反 
// 4重新填充回data中和缓存中
// 5重新计算总价格和总数量

// 底部全选反选
// 全选复选框绑定事件
// 获取data中的全选：allchecked变量
// 直接取反 allChecked = ! allchecked
// 把购物车数组和allchecked变量 再次重新设置回data 和设置回缓存中
import { request } from "../../request/req.js";
import regeneratorRuntime from "../../lib/runtime/runtime.js";
import { getSetting, chooseAddress, openSetting, showModal, showToast} from "../../utils/asyncWx.js";
Page({
  /**
   * 页面的初始数据
   */
  data: {
    address: {},
    cart: [],
    allChecked: false,
    totalNum: 0,
    totalPrice: 0
  },

  // 点击收货地址事件
  async handleChooseAddress() {
    try {
      // 1获取权限状态
      let res1 = await getSetting();
      const scopeAddress = res1.authSetting["scope.address"];;
      // 2.判断权限状态
      if (scopeAddress === false) {
        await openSetting();
      }
      // 4.直接调用获取地址api
      let address = await chooseAddress();
      // 将地址存入缓存中
      wx.setStorageSync('address', address);
    }
    catch(error) {
      console.log(error);
    }
    
  },

  // 商品单选
  checkChange(e) {
    // 获取被选中的商品对象id
    const goods_id = e.currentTarget.dataset.id;
    // 获取购物车数组
    let {cart} = this.data;
    // 找到被修改的商品对象
    let index = cart.findIndex((v) => v.goods_id === goods_id);
    // 该商品选中状态取反
    cart[index].checked = !cart[index].checked;
    
    this.setCart(cart);
  },

  // 设置购物车状态 重新计算商品总数量与总价格 全选 
  setCart(cart) {
    // 把购物车数组重新设置回缓存与data中
    // 重新计算
    let totalNum = 0;
    let totalPrice = 0;
    let allChecked = true;
    cart.forEach((v) => {
      if (v.checked) {
        totalNum += v.num;
        totalPrice += v.num * v.goods_price;
      } else {
        allChecked = false
      }
    })
    // 判断cart数组是否为空
    allChecked = cart.length != 0 ? allChecked : false;
    // 2.给address与cart赋值
    this.setData({
      cart,
      allChecked,
      totalNum,
      totalPrice
    });
    wx.setStorageSync("cart", cart);
  },


  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    // 1.获取缓存中的收货地址信息
    const address = wx.getStorageSync("address");
    // 获取缓存中的购物车数据
    const cart = wx.getStorageSync("cart") || [];
    // 计算全选 every方法有一个特性。如果目标数组是空数组的话，那么该方法也会返回一个true
    // 2.给address赋值
    this.setData({address,});
    this.setCart(cart);
  },

  // 底部购物车全选复选框点击事件
  itemAllcheck() {
    // 获取data中的购物车cart 与全选变量allchecked 
    let { cart, allChecked } = this.data;
    // 修改值
    allChecked = !allChecked;
    // 循环修改cart数组 中的商品选中状态
    cart.forEach(v=> v.checked = allChecked);
    // 重新设置cart 与缓存
    this.setCart(cart);
  },

  // 商品数量加减
  async itemNumEdit(e) {
    // console.log(e)
    // 获取传递过来的参数
    const { opt, id } = e.currentTarget.dataset;
    // 获取购物车数组
    let cart = this.data.cart;
    // 找到需要修改的商品的索引
    const index = cart.findIndex(v=> v.goods_id === id);
    // 判断当前商品数量是否等于1 且用户点击减号
    if (cart[index].num == 1 && opt === -1) {
      // 弹窗询问用户是否要删除
      const res = await showModal({content: '您是否要删除？'});
      if(res.confirm) {
        cart.splice(index,1);
        this.setCart(cart);
      }
    } else {
      // 修改数量
      cart[index].num += opt;
      // 重新设置data  和缓存
      this.setCart(cart);
    }
  },

  // 点击结算按钮
  async handlePay() {  
    // 获取收货地址与商品总数量
    const { address, totalNum} = this.data;
    // 判断有没有获取收货地址
    if (!address.userName) {
      await showToast('您还没有选择收货地址');
      return
    }
    // 判断购物车有没有商品
    if (totalNum === 0) {
      await showToast('您还没有选购商品');
      return
    }
    wx.navigateTo({
      url: '/pages/pay/pay',
      success: function(res) {},
    })
  }
})